#include <iostream>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <strings.h>
#include "inetaddr.hpp"
using namespace hladdr;
int sockfd;
InetAddr server;
void *Send(void *argv)
{
    while (true)
    {
        std::string massage;
        std::getline(std::cin, massage);
        // 发送信息
        sendto(sockfd, massage.c_str(), massage.size(), 0, server.GetInetAddr(), server.GetLen());
    }
}
void *recv(void *argv)
{
    while (true)
    {
        // 接受信息
        struct sockaddr_in peer;
        bzero(&peer, sizeof(peer));
        socklen_t len = sizeof(len);
        char buff[256];
        int n = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&peer, &len);
        if (n < 0)
        {
            std::cerr << "recvfrom error";
            continue;
        }
        buff[n] = '\0';
        std::cerr << buff << std::endl;
    }
}
int main(int agrc, char *argv[])
{
    if (agrc != 3)
    {
        std::cout << argv[0] << " serverip  serverport" << std::endl;
        return -1;
    }
    server.Set(argv[1], std::stoi(argv[2]));
    // 创建套接字
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0)
    {
        std::cerr << "socket error" << std::endl;
        return -1;
    }
    std::cout << "socket success" << std::endl;
    pthread_t s, r;
    pthread_create(&s, nullptr, Send, nullptr);
    pthread_create(&r, nullptr, recv, nullptr);

    pthread_join(s, nullptr);
    pthread_join(r, nullptr);
    return 0;
}

// int main(int agrc, char *argv[])
// {
//     if (agrc != 3)
//     {
//         std::cout << argv[0] << " serverip  serverport" << std::endl;
//         return -1;
//     }
//     InetAddr server(argv[1], std::stoi(argv[2]));
//     // 创建套接字
//     int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
//     if (sockfd < 0)
//     {
//         std::cerr << "socket error" << std::endl;
//         return -1;
//     }
//     std::cout << "socket success" << std::endl;
//     // 无需显示绑定
//     while (true)
//     {
//         std::string massage;
//         std::getline(std::cin, massage);
//         // 发送信息
//         sendto(sockfd, massage.c_str(), massage.size(), 0, server.GetInetAddr(), server.GetLen());
//         // 接受信息
//         struct sockaddr_in peer;
//         bzero(&peer, sizeof(peer));
//         socklen_t len = sizeof(len);
//         char buff[256];
//         int n = recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&peer, &len);
//         if (n < 0)
//         {
//             // 读取失败
//             std::cerr << "recvfrom error";
//             continue;
//         }
//         buff[n] = '\0';
//         std::cout << buff << std::endl;
//     }
//     return 0;
// }
